"""
RFdiffusion日志配置模块

提供统一的日志配置，支持通过环境变量控制日志级别
"""

import logging
import os
import sys
from typing import Optional


def get_log_level() -> int:
    """
    从环境变量获取日志级别
    
    环境变量 RFDIFFUSION_LOG_LEVEL 可以设置为：
    - DEBUG: 显示所有调试信息，包括详细的张量详细信息
    - INFO: 只显示基本信息（默认）
    - WARNING: 只显示警告和错误
    - ERROR: 只显示错误
    """
    log_level_str = os.environ.get('RFDIFFUSION_LOG_LEVEL', 'INFO').upper()
    
    level_mapping = {
        'DEBUG': logging.DEBUG,
        'INFO': logging.INFO,
        'WARNING': logging.WARNING,
        'ERROR': logging.ERROR
    }
    
    return level_mapping.get(log_level_str, logging.INFO)


def setup_logging(name: Optional[str] = None) -> logging.Logger:
    """
    设置日志记录器
    
    Args:
        name: logger名称，默认使用调用模块的名称
    
    Returns:
        配置好的logger对象
    """
    if name is None:
        # 获取调用模块的名称
        frame = sys._getframe(1)
        name = frame.f_globals.get('__name__', 'rfdiffusion')
    
    logger = logging.getLogger(name)
    
    # 避免重复配置
    if logger.handlers:
        return logger
    
    # 设置日志级别
    log_level = get_log_level()
    logger.setLevel(log_level)
    
    # 创建控制台处理器
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(log_level)
    
    # 设置日志格式 - 使用简单的格式避免递归问题
    formatter = logging.Formatter(
        '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)
    
    # 防止向上传播（避免重复输出）
    logger.propagate = False
    
    return logger


def get_logger(name: Optional[str] = None) -> logging.Logger:
    """
    获取logger对象的便捷函数
    
    Args:
        name: logger名称，默认使用调用模块的名称
    
    Returns:
        logger对象
    """
    return setup_logging(name)


# 便捷的模块级别logger
def get_module_logger() -> logging.Logger:
    """
    获取调用模块的logger
    """
    frame = sys._getframe(1)
    module_name = frame.f_globals.get('__name__', 'rfdiffusion')
    return setup_logging(module_name) 